home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / A86V402.ZIP / A13.DOC < prev    next >
Text File  |  1994-12-21  |  18KB  |  365 lines

  1. CHAPTER 13   ASSOCIATED TOOLS AND OUTPUT FILES
  2.  
  3.  
  4. Listings with A86
  5.  
  6. A86 has a powerful listing facility, that allows you to tailor
  7. the format of your listings to your specific needs.  Because the
  8. listing pass adds a significant percentage to the time it takes
  9. A86 to execute, the listing is not produced by default.  You must
  10. include either a +L switch, or the name of a file with a .LST
  11. extension on the A86 invocation line.
  12.  
  13. By default (+L but nothing else specified), an A86 listing file
  14. consists of a sequence of pages, each 59 lines long and 79
  15. characters wide.  Each page has a header line identifying A86 and
  16. its version number, giving the name of the program output file,
  17. the date and time of assembly, the name of the source file
  18. currently being listed, and a page number.  Note that I am not so
  19. obnoxious as to splash my company name over the top of every page
  20. of your listing!  If both a TITLE and a SUBTTL have been
  21. specified, the header consists of three content lines and one
  22. skipped line; otherwise, there are just two content lines.  Each
  23. listing line has a sequential line number, a hex offset and hex
  24. object bytes, an indicator field with "i" for include files and
  25. "m" for macro expansions, and the source code itself.  Nested
  26. includes have no special indication; nested macros are indicated
  27. by increasing indentation of the macro expansion line.  A86 tries
  28. to be intelligent about the formatting of its listings: it will
  29. break up the wraparound of a long line at a word if reasonable.
  30. It will avoid breaking up a multi-line listing of less than 10
  31. lines.  It will break pages at sensible locations (described in
  32. detail shortly, under the PAGE directive).  It will suppress
  33. blank lines at the top and bottom of pages (but it counts them in
  34. the sequential line numbering so you can tell they were there).
  35.  
  36. Five A86 switches, H, I, L, T, and W, allow you to control the
  37. existence and characteristics of titling, pagination, page-number
  38. format, page break control, source line numbering, hex object
  39. display, and source line display.  The operation of these
  40. switches is described in detail in Chapter 3.  Here are some
  41. examples of switch settings that will produce listings meeting
  42. some specialized needs:
  43.  
  44. +L21+T0+W12+I137 produces a listing consisting only of the source
  45. code, with the hex offset of each line placed to the left, and
  46. with the line truncated at 79 columns.  Such a listing file would
  47. be ideal for viewing the source file while debugging on a
  48. primitive remote system that cannot run D86.
  49.  
  50. +L9+T0+W4+I128 produces a list file of just source code, with all
  51. conditional-assembly lines and skipped code removed.  All
  52. titling, pagination, line numbers, and hex codes are eliminated,
  53. so the list file could be renamed as a source file, and
  54. reassembled.  This might be useful for archival purposes, or for
  55. giving individualized versions of a source file to parties who
  56. don't need any of the conditional-assembly options you've
  57. programmed.
  58.                                                              13-2
  59.  
  60. +L+I186+H15+W12 produces a list file that concentrates on the hex
  61. output, increasing the width to 16 bytes per line, showing up to
  62. 15 hex runover lines, and limiting the amount of source code
  63. shown.
  64.  
  65.  
  66. Listing Control Directives
  67.  
  68. In addition to the five switches just mentioned, A86 has a number
  69. of source-code directives that control aspects of listings.
  70.  
  71. The .NOLIST directive causes all subsequent listing to be
  72. suppressed, until a .LIST directive is seen.  Line numbering and
  73. page numbering continues during list suppression, so the result
  74. is as if you had text-edited the listing file to remove all the
  75. suppressed lines.
  76.  
  77. I also offer a macro-definition control code, #H, which causes
  78. the suppression of the listing of macro expansion lines.  If #H
  79. appears anywhere within a macro definition, all calls to that
  80. macro will be listed as the macro call line only, showing the
  81. generated hex object bytes on that call line.  This allows you to
  82. define macros that will be listed as if they were simple machine
  83. instructions.  This effect can be achieved for all macros with an
  84. L switch setting that doesn't include the value 4 (see Chapter
  85. 3).
  86.  
  87. The TITLE directive specifies a title that will appear at the top
  88. of every page of the entire assembly.  The title consists of the
  89. first 60 characters starting with the first nonblank after the
  90. word TITLE on the line.  If you give more than one TITLE
  91. directive in a program, only the first will be recognized.
  92.  
  93. The SUBTTL directive specifies a subtitle to appear at the top of
  94. every page until another SUBTTL directive is given (or until the
  95. next file change if you have the +T16 switch-bit value set).  If
  96. the directive is at the very top of the listing page, or it is
  97. shortly after an automatic page break, the subtitle will take
  98. effect on the page in which it appears.  Otherwise, it will take
  99. effect at the next page.
  100.  
  101. The PAGE directive serves several purposes.  The word PAGE by
  102. itself will force a new page in the listing, at that point.  A
  103. plus sign following the word PAGE causes a new page plus an
  104. incremented section number -- e.g. PAGE + on page 1-17 will cause
  105. a new page 2-1 to begin.  The word PAGE followed by one or more
  106. constant parameters will set various A86 listing variables to the
  107. specified parameter values.  The variables are as follows:
  108.  
  109. 1. The length, in lines, of a listing page.  Minimum is 10;
  110.    maximum is 65535.
  111.  
  112. 2. The width, in characters, of the maximum listing line.
  113.  
  114. 3,4,5,6. The number of lines at the end of a page, less than
  115.    which A86 guarantees will not be "widowed" after a page break
  116.    of level 1,2,3,4, respectively.
  117.                                                              13-3
  118.  
  119. Omitted parameters (either left off the end or via leading commas
  120. or 2 consecutive commas) will remain unchanged.
  121.  
  122. The concept of "page break levels" is unique to A86 listings: it
  123. is my attempt to get A86 to make intelligent decisions about
  124. where to issue new listing pages.  There are 4 page break levels,
  125. normally triggered by gaps (consecutive blank lines) in the
  126. source code, and by source-file changes.  One- and two-line gaps
  127. cause breaks of level 1 and 2, respectively.  Three-or-more-line
  128. gaps cause a break of level 3.  A source-file change causes a
  129. break of level 4.  If a page break occurs close to the end of a
  130. page, and a break of greater level hasn't already been marked,
  131. A86 will mark the point for a potential new page.  If a page
  132. break of equal or greater level doesn't occur before the page is
  133. full, A86 will issue a new page at the marked point.  The
  134. definition of "close to the end of the page" is 10,20,30, and 40
  135. lines, respectively, for break levels 1,2,3,4.  Those line counts
  136. can be changed by parmeters 3,4,5,6 of the PAGE directive, as
  137. already described.
  138.  
  139. If you are intimidated by all this, or if you want to control
  140. page break levels manually, you may specify a T switch value that
  141. does not include the "auto-paging" option value 4.  With that
  142. option disabled, page break levels will occur only at places
  143. where you issue a PAGE directive containing a special parameter
  144. value /1, /2, /3, or /4.  The leading slash indicates that a page
  145. break of the indicated level is desired here.  Such a parameter
  146. will typically be given by itself following PAGE; but, if you
  147. wish, it can be interspersed anywhere among other parameter
  148. values -- it will not be "counted" for the purposes of
  149. determining the other parameters' positions.
  150.  
  151.  
  152.  
  153. Cross-reference Facility
  154.  
  155.  
  156. When you specify the +X switch, A86 will create a
  157. cross-referenced symbol table listing of your program.
  158.  
  159. The output file, having a standard extension of .XRF is an
  160. alphabetical listing of all the non-local symbols in your
  161. program.  For each symbol, A86 gives its type, the file in which
  162. it was defined, its value, and a list of all procedures in which
  163. the file was used.  If you print this file, you typically use the
  164. TCOLS tool to obtain a multi-column listing from A86's
  165. single-column output.
  166.  
  167. Note the use of procedure names to identify references -- this
  168. makes the cross-reference listing truly readable.  Other
  169. cross-reference listings often give either line numbers, which
  170. are meaningless unless you go find the associated line; or a file
  171. name, which doesn't give you as much useful information.
  172.  
  173. Here is a more detailed description of the various pieces of
  174. information provided for each symbol:
  175.                                                              13-4
  176.  
  177. 1. TYPE.  Labels are indicated by a colon immediately following
  178.    the symbol name.  Special symbols such as macro names are
  179.    denoted by an appropriate word such as "macro" in place of the
  180.    value on the following line.  Other symbol types are described
  181.    by one or two characters, following the symbol name.
  182.    Possibilities for the first character are:
  183.  
  184.         m  for a simple memory variable
  185.         +  for an index memory quantity
  186.         c  for a constant
  187.         i  for an interrupt equate
  188.         s  for a structure
  189.  
  190.     If there is a second letter, it is a size attribute: b for
  191.     byte, w for word, f for far (or doubleword).
  192.  
  193. 2. FILE in which the symbol was defined.  The name is stripped of
  194.    its extension, which is presumably the same for all your
  195.    source files.  The name is preceded by = or period, which
  196.    denotes a definition of, not a reference to the symbol.
  197.  
  198. 3. VALUE, given as 4 hex digits, on the line following the
  199.    symbol.  For memory variables, this is the location of the
  200.    variable.  For indexed quantities, this is the
  201.    constant-displacement part of the quantity.  For structures,
  202.    it is the size of the structure.  For interrupt equates, it is
  203.    the number of the interrupt.
  204.  
  205. 4. REFERENCES, given on indented lines following the symbol name.
  206.    All occurrences of the symbol in your program produce a
  207.    reference.  If the symbol is the first thing on a line, it is
  208.    considered a "definition" of that symbol, the reference listed
  209.    is the source file name.  The name is preceded by a period if
  210.    the definition was via a colon (i.e., a label); it is preceded
  211.    by an equals sign otherwise. If the symbol is not the first
  212.    thing on the line, then it is not a definition.  The reference
  213.    listing consists of the name of the last definition that A86
  214.    scanned (which, if your program is organized in a standard
  215.    way, will be the name of the procedure in which the reference
  216.    occurred.
  217.  
  218.    Observe that you must use the local-label facility of A86 to
  219.    make this work.  If you don't use local labels as your
  220.    "place-marker" symbols, the symbol the cross-reference gives
  221.    you will often be the name of the last "place-marker" symbol,
  222.    not the name of the last procedure.
  223.  
  224.    To save space, duplicate reference entries are denoted by a
  225.    single entry, followed by "*n", where n is the decimal number
  226.    of occurrences of that entry.
  227.                                                              13-5
  228.  
  229. A86LIB Source File Library Tool
  230.  
  231. There is a tool, A86LIB.COM, available only if you are
  232. registered, that lets you build libraries of source files.  To
  233. use A86LIB, you must first code and debug the A86 source files
  234. that you wish to include in your library.  Then you issue the
  235. command A86LIB followed by the names of the source files.
  236. Wildcards are accepted; so you will typically want to gather the
  237. source files into a single directory, and use the wildcard
  238. specification.  For example, if you use the filename extension .8
  239. for your source files, you can issue the command A86LIB *.8 to
  240. create the library.
  241.  
  242. The library created consists of a catalog file, always named
  243. A86.LIB, together with the source files that you fed to A86LIB to
  244. create the catalog.
  245.  
  246. The following observations about A86LIB are in order:
  247.  
  248. 1. Unlike object-code libraries, A86.LIB contains only symbol
  249.    names and file names; it does not contain the code itself. You
  250.    MUST retain the source files used to create A86.LIB, because
  251.    A86 will read those files that it needs after consulting
  252.    A86.LIB to read their names.
  253.  
  254. 2. A86LIB records all non-local symbols that start a line, and
  255.    are followed by a colon, an EQU or the word MACRO.  (Recall
  256.    that local symbols are those names consisting of a single
  257.    letter followed by one or more decimal digits.)   A86LIB also
  258.    records all symbols appearing on lines starting with the word
  259.    PUBLIC.
  260.  
  261. 3. If a symbol appears in more than one library source file, it
  262.    will be logged for the first file A86LIB sees, and not the
  263.    subsequent ones.  No error will be reported, unless and until
  264.    A86 tries to assemble both files in one assembly, and sees a
  265.    conflict.
  266.  
  267. 4. A86LIB is simple-minded.  A86LIB does NOT expand macros; nor
  268.    does it recognize conditional-assembly directives. This is
  269.    because the library files do not stand by themselves; the
  270.    macros and conditional-assembly variables being used might
  271.    well be defined in the main program of the programs accessing
  272.    the library files.
  273.  
  274. You may update A86.LIB by running A86LIB again; either with new
  275. files or previously-recorded ones.  If A86LIB is given a file it
  276. had already read in a previous run, then A86LIB marks all the
  277. symbols it had logged for the file as deleted, before rereading
  278. the file.  Those symbols that are still in the file are then
  279. "unmarked".  Thus, symbols that have been deleted from the file
  280. disappear functionally from A86.LIB, but still occupy space
  281. within A86.LIB.  What I'm getting at is this: A86LIB will
  282. tolerate alterations in library files quite nicely; but for
  283. optimum storage efficiency you should delete A86.LIB and rebuild
  284. it from scratch any time you delete anything from the library.
  285. A86LIB is so fast that this is never very painful.
  286.                                                              13-6
  287.  
  288. Using A86.LIB in A86 Assemblies
  289.  
  290. Once you have created a library with A86LIB, you access it simply
  291. by calling the procedures in it from your A86 program.  When A86
  292. finishes an assembly and sees that there are undefined symbols in
  293. your program, it will automatically look for copies of A86.LIB in
  294. the current directory (then in other directories, as described in
  295. the next section).  If any of the undefined symbols are found in
  296. the A86.LIB catalog, the files containing them are assembled.
  297. You see this in the list of files output to the console by A86.
  298.  
  299. The subroutines in your library or libraries are effectively a
  300. permanent part of the A86 language.  They can be called up
  301. effortlessly in your A86 programs.  In time you can build up an
  302. impressive arsenal of library modules, making A86 as easy to
  303. program in as most high-level languages.
  304.  
  305. You may now have macros in your A86LIB library.  Here's how it
  306. works: when A86 sees a new symbol at the beginning of a line, in
  307. a context where it would formerly have issued an error, A86 will
  308. first look in the A86LIB libraries for the symbol.  If it's
  309. found, A86 will INCLUDE that library file on the spot, and then
  310. assemble the line.  NOTE that if the macro is being called within
  311. a sequence of executable instructions, the library file must
  312. generate no output object code.
  313.  
  314.  
  315.  
  316. Environment Variable A86LIB
  317.  
  318. You can set an environment variable A86LIB to specify which
  319. drives or subdirectories contain A86.LIB files.  The variable
  320. consists of a sequence of path names separated by semicolons,
  321. just like the PATH variable used by the operating system.  For
  322. example, if you include in your AUTOEXEC.BAT file the line
  323.  
  324.    SET A86LIB=C:\bin\lib;\tools\a86lib
  325.  
  326. then A86 will look for A86.LIB in the current directory, then it
  327. will look for C:\bin\lib\A86.LIB, then \tools\a86lib\A86.LIB. A86
  328. will keep looking in all three catalog files, assembling the
  329. appropriate source files from any or all of them, until there are
  330. no more undefined symbols, or there are no more source files to
  331. assemble.
  332.  
  333. For every symbol in an A86.LIB catalog, there is recorded the
  334. name of the library file containing the symbol.  The library file
  335. is assumed to be in the same directory as its A86.LIB file,
  336. unless a complete path name (starting with \ or a drive
  337. specifier) was fed to A86.LIB when A86.LIB was created.
  338.                                                              13-7
  339.  
  340. Forcing a Library Search
  341.  
  342. You may force A86 to assemble library files before moving on to
  343. more of your program's source files.  You do this by placing a
  344. hash sign # (hex code 23) between file names in your invocation
  345. line.  For example, suppose your program has two modules FIRST.8
  346. and LAST.8.  FIRST.8 calls subroutines from your library; but you
  347. need the library files assembled before LAST.8 is assembled. (You
  348. might want this because LAST.8 allocates memory space beyond the
  349. end of your program, which would be the end of LAST.8 if it were
  350. truly the last module.)  You accomplish this by the invocation
  351. line:
  352.  
  353.   A86 FIRST.8 # LAST.8
  354.  
  355. Note that there is never any need to force a library search at
  356. the end of your program modules: A86 always makes a library
  357. search there, if you have any undefined symbols.
  358.  
  359. You may now also force a library search from within a source
  360. file, by placing a line with INCLUDE by itself with no file
  361. names, into the source code.  A86 will include any library files
  362. necessary to resolve any forward-references at the point of the
  363. INCLUDE.
  364.  
  365.